#include "../Headers/dis_img_pro.h"

int recvTask(int sockFd)
{
   // 先获取文件名
   char name[1024] = {0};
   int dataLength;
   char new_name[2048];
   // int ret = recv(sockFd,&dataLength,sizeof(int),MSG_WAITALL);
   int ret = recvn(sockFd, &dataLength, sizeof(int));
   ERROR_CHECK(ret, -1, "recv");
   // ret = recv(sockFd,name,dataLength,MSG_WAITALL);
   ret = recvn(sockFd, name, dataLength);
   puts(name);
   ERROR_CHECK(ret, -1, "recv");
   sprintf(new_name, "serverImg/%s", name);
   int fd = open(new_name, O_RDWR | O_CREAT | O_TRUNC, 0666);
   ERROR_CHECK(fd, -1, "open");
   int fileSize;
   recvn(sockFd, &dataLength, sizeof(int));
   recvn(sockFd, &fileSize, dataLength);
   printf("fileSize = %d\n", fileSize);
   char buf[1000] = {0};
   time_t timeBeg, timeEnd;
   timeBeg = time(NULL);

   //  int pipefds[2];
   //  pipe(pipefds);
   //  int total = 0;
   //  while(total < fileSize){
   //      int ret = splice(sockFd,NULL,pipefds[1],NULL,4096,SPLICE_F_MORE);
   //      total += ret;
   //      //usleep(2000000);
   //      splice(pipefds[0],NULL,fd,NULL,ret,SPLICE_F_MORE);
   //  }

   ftruncate(fd, fileSize);
   char *p = (char *)mmap(NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
   ERROR_CHECK(p, MAP_FAILED, "mmap");
   recvn(sockFd, p, fileSize);

   recvn(sockFd, &dataLength, sizeof(int));
   printf("dataLength = %d\n", dataLength);
   timeEnd = time(NULL);
   printf("total time = %ld\n", timeEnd - timeBeg);
}

int remove_all_files_and_subdirs(const char *path) {
    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(path))) {
        perror("opendir");
        return -1;
    }

    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        char subPath[PATH_MAX];
        snprintf(subPath, sizeof(subPath), "%s/%s", path, entry->d_name);

        if (entry->d_type == DT_DIR) {
            if (remove_all_files_and_subdirs(subPath) != 0) {
                closedir(dir);
                return -1;
            }
            rmdir(subPath);
        } else {
            unlink(subPath);
        }
    }

    closedir(dir);
    return rmdir(path);
}
int myServer_task(int netFd)
{
   char buf[1024] = {0};
   while (1)
   {
      send(netFd, TASK_ON, 1024, 0);
      recv(netFd, buf, 1024, 0);
      if (0 == strcmp(buf, TASK_ON))
      {
         recvTask(netFd);
      }
      else if (0 == strcmp(buf, TASK_SND_OVER))
      {
         puts(buf);
         break;
      }
   }
   if(fork() == 0){
      char buf[1024];
      bzero(buf, 1024);
   // chdir("/home/leao/work/sdSys/ultralytics/");
   sprintf(buf, " yolo task=detect mode=predict model=yolov8n.pt source=/home/leao/work/sdSys/project/distributed-image-processing/dis_img_pro/serverImg");
   system(buf);
  exit(1);

   }
   wait(NULL);
   puts("ok");
   uploadingTask(netFd);
    remove_all_files_and_subdirs("runs");
}
// int recvTask(int sockFd)
// {
//     // 先获取文件名
//     char name[1024] = {0};
//     int dataLength;
//     // int ret = recv(sockFd,&dataLength,sizeof(int),MSG_WAITALL);
//     int ret = recvn(sockFd, &dataLength, sizeof(int));
//     ERROR_CHECK(ret, -1, "recv");
//     // ret = recv(sockFd,name,dataLength,MSG_WAITALL);
//     ret = recvn(sockFd, name, dataLength);
//     ERROR_CHECK(ret, -1, "recv");
//     char new_name[2048] = {0};
//     sprintf(new_name, "/serverImg/%s", name);
//     puts(new_name);
//     int fd = open(new_name, O_RDWR | O_CREAT | O_TRUNC, 0666);
//     ERROR_CHECK(fd, -1, "open");
//     int fileSize;
//     recvn(sockFd, &dataLength, sizeof(int));
//     recvn(sockFd, &fileSize, dataLength);
//     printf("fileSize = %d\n", fileSize);
//     char buf[1000] = {0};
//     time_t timeBeg, timeEnd;
//     timeBeg = time(NULL);

//     int pipefds[2];
//     pipe(pipefds);
//     int total = 0;

//     // while (total < fileSize)
//     // {
//     //     int ret = splice(sockFd, NULL, pipefds[1], NULL, 4096, SPLICE_F_MORE);
//     //     total += ret;
//     //     usleep(2000000);
//     //     splice(pipefds[0], NULL, fd, NULL, ret, SPLICE_F_MORE);
//     // }

//     ftruncate(fd, fileSize);
//     char *p = (char *)mmap(NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
//     ERROR_CHECK(p, MAP_FAILED, "mmap");
//     recvn(sockFd, p, fileSize);

//     recvn(sockFd, &dataLength, sizeof(int));
//     printf("dataLength = %d\n", dataLength);
//     timeEnd = time(NULL);
//     printf("total time = %ld\n", timeEnd - timeBeg);
//     return 0;
// }
// int transFile_server(int netFd, threadPool *pThreadPool)
// {
//     puts("transFile_server");
//     char buf_netFd[1024] = {0};
//     char buf_destfd[1024] = {0};
//     char len[16] = {0};
//     if (pThreadPool->task_online.size > 1)
//     {
//         puts("send-online-size");
//         send(netFd, TASK_ON, 1024, 0);
//     }
//     // 获取任务数量
//     bzero(buf_netFd, 1024);
//      recv(netFd, buf_netFd, 4, 0);
//     puts(buf_netFd);
//     int task_num = atoi(buf_netFd);
//     printf("task_num-->%d\n", task_num);
//     sprintf(buf_netFd, "%d", pThreadPool->task_online.size - 1);
//     send(netFd, buf_netFd, 4, 0);
//     tasks *fd_head = pThreadPool->task_online.pFront;

//     for (int k = 0; k < pThreadPool->task_online.size; k++)
//     {
//         printf("k-->%d\n", k);
//         printf(" pThreadPool->task_online.size:%d\n", pThreadPool->task_online.size);

//         if (fd_head->netfd == netFd)
//         {

//             fd_head = fd_head->pNext;

//             continue;
//         }

//         send(fd_head->netfd, TASK_DOWN, 1024, 0);
//         printf("tasknum-->%d\n", task_num / (pThreadPool->task_online.size - 1));
//         for (size_t j = 0; j < task_num / (pThreadPool->task_online.size - 1); j++)
//         {

//             recv(fd_head->netfd, buf_destfd, 1024, 0);
//             puts(buf_destfd);
//             if (0 == strcmp(buf_destfd, TASK_ON))
//             {
//                 send(netFd, TASK_ON, 1024, 0);
//             }
//             recv(netFd, buf_netFd, 1024, 0);

//             puts(buf_netFd);
//             if (0 == strcmp(buf_netFd, TASK_UP))
//             {
//                 send(fd_head->netfd, TASK_DOWN, 1024, 0);
//                 while (1)
//                 {
//                     puts("??????");
//                     recvTask(netFd);
//                     transmitTask(netFd, pThreadPool->taskQueue.pFront->netfd);
//                     break;
//                 }
//             }
//             else
//             {
//                 puts("task_up error");
//             }
//         }
//         recv(netFd, buf_netFd, 1024, 0);
//         if (0 == strcmp(buf_netFd, TASK_SND_OVER))
//         {
//             send(fd_head->netfd, TASK_SND_OVER, 1024, 0);
//             puts("任务转发完成");
//         }
//         fd_head = fd_head->pNext;
//     }
//         char buf[1024];
//     bzero(buf, 1024);
//     bzero(buf, 1024);
//     chdir("/home/leao/work/sdSys/ultralytics/");
//     sprintf(buf, " yolo task=detect mode=predict model=yolov8n.pt source=/home/leao/work/sdSys/project/distributed-image-processing/dis_img_pro/serverImg");
//     system(buf);
// }

// int new_task(int netFd, threadPool *pThreadPool)
// {

//     puts("transFile_server");
//     char buf_netFd[1024] = {0};
//     char buf_destfd[1024] = {0};
//     // char len[16] = {0};
//     if (pThreadPool->task_online.size > 1)
//     {
//         puts("send-online-size");
//         send(netFd, TASK_ON, 1024, 0);
//     }
//     // 获取任务数量
//     bzero(buf_netFd, 1024);
//     recv(netFd, buf_netFd, 4, 0);
//     puts(buf_netFd);
//     int task_num = atoi(buf_netFd);
//     printf("task_num-->%d\n", task_num);
//     sprintf(buf_netFd, "%d", pThreadPool->task_online.size - 1);
//     send(netFd, buf_netFd, 4, 0);
//     tasks *fd_head = pThreadPool->task_online.pFront;

//     for (int k = 0; k < pThreadPool->task_online.size; k++)
//     {
//         printf("k-->%d\n", k);
//         printf(" pThreadPool->task_online.size:%d\n", pThreadPool->task_online.size);

//         if (fd_head->netfd == netFd)
//         {

//             fd_head = fd_head->pNext;

//             continue;
//         }

//         send(fd_head->netfd, TASK_DOWN, 1024, 0);
//         printf("tasknum-->%d\n", task_num / (pThreadPool->task_online.size - 1));
//         for (size_t j = 0; j < task_num / (pThreadPool->task_online.size - 1); j++)
//         {

//             recv(fd_head->netfd, buf_destfd, 1024, 0);
//             puts(buf_destfd);
//             if (0 == strcmp(buf_destfd, TASK_ON))
//             {
//                 send(netFd, TASK_ON, 1024, 0);
//             }
//             recv(netFd, buf_netFd, 1024, 0);

//             puts(buf_netFd);
//             if (0 == strcmp(buf_netFd, TASK_UP))
//             {
//                 send(fd_head->netfd, TASK_DOWN, 1024, 0);
//                 while (1)
//                 {
//                     puts("??????");
//                     recvTask(netFd);

//                     break;
//                 }
//             }
//             else
//             {
//                 puts("task_up error");
//             }
//         }
//         recv(netFd, buf_netFd, 1024, 0);
//         if (0 == strcmp(buf_netFd, TASK_SND_OVER))
//         {
//             send(fd_head->netfd, TASK_SND_OVER, 1024, 0);
//             puts("任务转发完成");
//         }
//         fd_head = fd_head->pNext;
//     }
//     char buf[1024];
//     bzero(buf, 1024);
//     bzero(buf, 1024);
//     chdir("/home/leao/work/sdSys/ultralytics/");
//     sprintf(buf, " yolo task=detect mode=predict model=yolov8n.pt source=/home/leao/work/sdSys/project/distributed-image-processing/dis_img_pro/serverImg");
//     system(buf);
// }